package org.opennaas.extensions.bod.autobahn.protocol; /* * #%L * OpenNaaS :: BoD :: Autobahn driver * %% * Copyright (C) 2007 - 2014 FundaciĆ³ Privada i2CAT, Internet i InnovaciĆ³ a Catalunya * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import static com.google.common.base.Preconditions.checkState; import static org.opennaas.core.resources.protocol.IProtocolSession.Status.CONNECTED; import static org.opennaas.core.resources.protocol.IProtocolSession.Status.DISCONNECTED_BY_USER; import static org.opennaas.core.resources.protocol.ProtocolSessionContext.PROTOCOL_URI; import java.util.Map; import javax.xml.namespace.QName; import javax.xml.ws.Service; import javax.xml.ws.WebServiceException; import javax.xml.ws.soap.SOAPBinding; import net.geant.autobahn.administration.Administration; import net.geant.autobahn.useraccesspoint.UserAccessPoint; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.opennaas.core.resources.protocol.IProtocolMessageFilter; import org.opennaas.core.resources.protocol.IProtocolSession; import org.opennaas.core.resources.protocol.IProtocolSessionListener; import org.opennaas.core.resources.protocol.ProtocolException; import org.opennaas.core.resources.protocol.ProtocolSessionContext; import com.google.common.base.Strings; public class AutobahnProtocolSession implements IProtocolSession { private final static QName USER_ACCESS_POINT_SERVICE = new QName("http://useraccesspoint.autobahn.geant.net/", "UserAccessPointService"); private final static QName USER_ACCESS_POINT_PORT = new QName("http://useraccesspoint.autobahn.geant.net/", "UserAccessPointPort"); private final static QName ADMINISTRATION_SERVICE = new QName("http://administration.autobahn.geant.net/", "AdministrationService"); private final static QName ADMINISTRATION_PORT = new QName("http://administration.autobahn.geant.net/", "AdministrationPort"); private final Log log = LogFactory.getLog(AutobahnProtocolSession.class); private ProtocolSessionContext protocolSessionContext; private String sessionID; private UserAccessPoint uapService; private Administration administrationService; private Status status; public AutobahnProtocolSession(ProtocolSessionContext protocolSessionContext, String sessionID) throws ProtocolException { this.protocolSessionContext = protocolSessionContext; this.sessionID = sessionID; this.status = DISCONNECTED_BY_USER; } @Override public void asyncSend(Object requestMessage) throws ProtocolException { throw new UnsupportedOperationException("asyncSend not supported by AutobahnProtocolSession"); } @Override public Object sendReceive(Object requestMessage) throws ProtocolException { throw new UnsupportedOperationException("sendReceive not supported by AutobahnProtocolSession"); } @Override public void connect() throws ProtocolException { uapService = createUserAccessPointService(getServiceUri() + "uap2"); administrationService = createAdministrationService(getServiceUri() + "administration2"); status = CONNECTED; } @Override public void disconnect() throws ProtocolException { status = DISCONNECTED_BY_USER; uapService = null; administrationService = null; } @Override public ProtocolSessionContext getSessionContext() { return protocolSessionContext; } @Override public String getSessionId() { return sessionID; } @Override public Status getStatus() { return status; } @Override public void registerProtocolSessionListener(IProtocolSessionListener protocolSessionListener, IProtocolMessageFilter protocolMessageFilter, String idListener) { } @Override public void unregisterProtocolSessionListener(IProtocolSessionListener protocolSessionListener, String idListener) { } @Override public void setSessionContext(ProtocolSessionContext context) { this.protocolSessionContext = context; } @Override public void setSessionId(String sessionId) { this.sessionID = sessionId; } public UserAccessPoint getUserAccessPointService() { checkState(status == CONNECTED); return uapService; } public Administration getAdministrationService() { checkState(status == CONNECTED); return administrationService; } private String getServiceUri() throws ProtocolException { Map<String, Object> parameters = protocolSessionContext.getSessionParameters(); String uri = (String) parameters.get(PROTOCOL_URI); if (Strings.isNullOrEmpty(uri)) { throw new ProtocolException(PROTOCOL_URI + " is missing in protocol session context."); } if (!uri.endsWith("/")) { uri = uri + "/"; } return uri; } private <T> T createSoapService(String uri, QName serviceName, QName portName, Class<T> clazz) throws ProtocolException { /* * The JAXWS SPI uses the context class loader to locate an implementation. We therefore make sure the context class loader is set to our * class loader. */ Thread thread = Thread.currentThread(); ClassLoader oldLoader = thread.getContextClassLoader(); try { thread.setContextClassLoader(getClass().getClassLoader()); Service service = Service.create(serviceName); service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, uri); return service.getPort(portName, clazz); } catch (WebServiceException e) { throw new ProtocolException("Failed to create Autobahn session: " + e.getMessage(), e); } finally { thread.setContextClassLoader(oldLoader); } } private UserAccessPoint createUserAccessPointService(String uri) throws ProtocolException { return createSoapService(uri, USER_ACCESS_POINT_SERVICE, USER_ACCESS_POINT_PORT, UserAccessPoint.class); } private Administration createAdministrationService(String uri) throws ProtocolException { return createSoapService(uri, ADMINISTRATION_SERVICE, ADMINISTRATION_PORT, Administration.class); } }